package com.snail.clouds.api.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.snail.clouds.framework.dto.UserProfileDTO;
import com.snail.clouds.framework.entity.UserProfile;
import com.snail.clouds.framework.service.UserProfileService;
import com.snail.clouds.framework.api.ApiResponse;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.stream.Collectors;

/**
 * 用户管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserProfileService userService;

    /**
     * 用户注册接口（公开接口，无需认证）
     * @param userProfileDTO 用户信息
     * @return 是否注册成功
     */
    @PostMapping("/register")
    public ApiResponse<Void> registerUser(@Valid @RequestBody UserProfileDTO userProfileDTO) {
        log.info("用户注册，用户编码: {}", userProfileDTO.getUserCode());
        
        try {
            // 检查用户编码是否已存在
            if (userService.existsByUserCode(userProfileDTO.getUserCode())) {
                log.warn("用户编码已被注册: {}", userProfileDTO.getUserCode());
                return ApiResponse.error("用户编码已被注册");
            }
            
            // 使用DTO的convertToEntity方法进行转换
            UserProfile user = UserProfileDTO.convertToEntity(userProfileDTO);
            
            // 使用MyBatis Plus的通用保存方法
            boolean result = userService.save(user);
            if (result) {
                log.info("用户注册成功，用户ID: {}", user.getId());
                return ApiResponse.success("用户注册成功", null);
            } else {
                log.error("用户注册失败，用户编码: {}", userProfileDTO.getUserCode());
                return ApiResponse.error("用户注册失败");
            }
        } catch (Exception e) {
            log.error("用户注册异常: {}", e.getMessage(), e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 获取当前登录用户信息
     * @param request HTTP请求
     * @return 当前用户信息
     */
    @GetMapping("/current")
    public ApiResponse<UserProfileDTO> getCurrentUser(HttpServletRequest request) {
        log.info("获取当前登录用户信息");
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            log.warn("未获取到用户信息");
            return ApiResponse.error("未获取到用户信息");
        }
        
        log.info("当前用户ID: {}", userId);
        // 使用MyBatis Plus的通用方法getById并转换为DTO
        UserProfile user = userService.getById(userId);
        if (user == null) {
            log.warn("用户不存在，用户ID: {}", userId);
            return ApiResponse.error("用户不存在");
        }
        
        // 使用DTO的convert方法进行转换
        UserProfileDTO userProfileDTO = UserProfileDTO.convert(user);
        log.info("成功获取用户信息，用户编码: {}", user.getUserCode());
        return ApiResponse.success(userProfileDTO);
    }

    /**
     * 分页查询用户列表
     * @param page 页码
     * @param size 每页大小
     * @param keyword 搜索关键词
     * @return 用户分页数据
     */
    @GetMapping
    public ApiResponse<IPage<UserProfileDTO>> getUserPage(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String keyword,
            HttpServletRequest request) {
        
        log.info("分页查询用户列表，页码: {}, 大小: {}, 关键词: {}", page, size, keyword);
        
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            log.warn("未获取到用户信息");
            return ApiResponse.error("未获取到用户信息");
        }
        
        log.info("当前操作用户ID: {}", userId);

        // 创建分页对象
        Page<UserProfile> pageParam = new Page<>(page, size);
        
        // 构造查询条件
        com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<UserProfile> queryWrapper = 
            new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<>();
        
        // 如果提供了关键词，则根据邮箱或昵称进行模糊查询
        if (keyword != null && !keyword.isEmpty()) {
            queryWrapper.and(wrapper -> wrapper
                .like("user_code", keyword)
                .or()
                .like("nickname", keyword));
        }
        
        // 查询数据
        IPage<UserProfile> userPage = userService.page(pageParam, queryWrapper);
        log.info("查询到 {} 条用户记录", userPage.getTotal());
        
        // 转换为DTO分页结果
        Page<UserProfileDTO> dtoPage = new Page<>(userPage.getCurrent(), userPage.getSize(), userPage.getTotal());
        dtoPage.setRecords(userPage.getRecords().stream()
                .map(UserProfileDTO::convert)
                .collect(Collectors.toList()));
        
        log.info("成功返回用户分页数据");
        return ApiResponse.success(dtoPage);
    }

    /**
     * 根据ID获取用户信息
     * @param id 用户ID
     * @return 用户信息
     */
    @GetMapping("/{id}")
    public ApiResponse<UserProfileDTO> getUserById(@PathVariable Long id, HttpServletRequest request) {
        log.info("根据ID获取用户信息，用户ID: {}", id);
        
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            log.warn("未获取到用户信息");
            return ApiResponse.error("未获取到用户信息");
        }
        
        log.info("当前操作用户ID: {}", userId);
        
        // 使用MyBatis Plus的通用方法getById并转换为DTO
        UserProfile user = userService.getById(id);
        if (user == null) {
            log.warn("用户不存在，用户ID: {}", id);
            return ApiResponse.error("用户不存在");
        }
        
        // 使用DTO的convert方法进行转换
        UserProfileDTO userProfileDTO = UserProfileDTO.convert(user);
        log.info("成功获取用户信息，用户编码: {}", user.getUserCode());
        return ApiResponse.success(userProfileDTO);
    }

    /**
     * 创建用户
     * @param userProfileDTO 用户信息
     * @return 是否创建成功
     */
    @PostMapping
    public ApiResponse<Void> createUser(@Valid @RequestBody UserProfileDTO userProfileDTO, HttpServletRequest request) {
        log.info("创建用户，用户编码: {}", userProfileDTO.getUserCode());
        
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            log.warn("未获取到用户信息");
            return ApiResponse.error("未获取到用户信息");
        }
        
        log.info("当前操作用户ID: {}", userId);
        
        try {
            // 检查用户编码是否已存在
            if (userService.existsByUserCode(userProfileDTO.getUserCode())) {
                log.warn("用户编码已被注册: {}", userProfileDTO.getUserCode());
                return ApiResponse.error("用户编码已被注册");
            }
            
            // 使用DTO的convertToEntity方法进行转换
            UserProfile user = UserProfileDTO.convertToEntity(userProfileDTO);
            
            // 使用MyBatis Plus的通用保存方法
            boolean result = userService.save(user);
            if (result) {
                log.info("用户创建成功，用户ID: {}", user.getId());
                return ApiResponse.success("用户创建成功", null);
            } else {
                log.error("用户创建失败，用户编码: {}", userProfileDTO.getUserCode());
                return ApiResponse.error("用户创建失败");
            }
        } catch (Exception e) {
            log.error("创建用户异常: {}", e.getMessage(), e);
            return ApiResponse.error(e.getMessage());
        }
    }

    /**
     * 更新用户信息
     * @param id 用户ID
     * @param userProfileDTO 用户信息
     * @return 是否更新成功
     */
    @PutMapping("/{id}")
    public ApiResponse<Void> updateUser(@PathVariable Long id,
                                      @Valid @RequestBody UserProfileDTO userProfileDTO,
                                      HttpServletRequest request) {
        log.info("更新用户信息，用户ID: {}", id);
        
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            log.warn("未获取到用户信息");
            return ApiResponse.error("未获取到用户信息");
        }
        
        log.info("当前操作用户ID: {}", userId);
        
        // 使用DTO的convertToEntity方法进行转换
        UserProfile user = UserProfileDTO.convertToEntity(userProfileDTO);
        user.setId(id);
        
        // 使用MyBatis Plus的通用更新方法
        boolean result = userService.updateById(user);
        if (result) {
            log.info("用户更新成功，用户ID: {}", id);
            return ApiResponse.success("用户更新成功", null);
        } else {
            log.error("用户更新失败，用户ID: {}", id);
            return ApiResponse.error("用户更新失败");
        }
    }

    /**
     * 删除用户
     * @param id 用户ID
     * @return 是否删除成功
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteUser(@PathVariable Long id, HttpServletRequest request) {
        log.info("删除用户，用户ID: {}", id);
        
        // 从请求属性中获取用户ID
        Long userId = (Long) request.getAttribute("userId");
        if (userId == null) {
            log.warn("未获取到用户信息");
            return ApiResponse.error("未获取到用户信息");
        }
        
        log.info("当前操作用户ID: {}", userId);
        
        // 使用MyBatis Plus的通用删除方法
        boolean result = userService.removeById(id);
        if (result) {
            log.info("用户删除成功，用户ID: {}", id);
            return ApiResponse.success("用户删除成功", null);
        } else {
            log.error("用户删除失败，用户ID: {}", id);
            return ApiResponse.error("用户删除失败");
        }
    }
}